<?php

namespace app\middleware;

use ReflectionClass;
use support\Redis;
use Webman\MiddlewareInterface;
use Webman\Http\Response;
use Webman\Http\Request;
use app\model\AdminsModel;
use app\model\RolesModel;
use app\model\PermissionModel;
use app\model\RolePermissionModel;

class AuthCheck implements MiddlewareInterface
{
    public function process(Request $request, callable $handler): Response
    {

        // 通过反射获取控制器哪些方法不需要登录
        $controller = new ReflectionClass($request->controller);
        $noNeedLogin = $controller->getDefaultProperties()['noNeedLogin'] ?? [];
        $noNeedPermission = $controller->getDefaultProperties()['noNeedPermission'] ?? [];

        // 访问的方法需要登录
        if (!in_array($request->action, $noNeedLogin)) {
            // 获取请求头中的token
            $token = request()->header('authorization');

            if (!$token) return json(["code" => 2001, "message" => "缺少请求头参数：authorization"]);

            // 从Redis获取用户ID
            $adminId = Redis::get($token);
            if (empty($adminId)) {
                return json(["code" => 2001, "message" => "登录已过期"]);
            } else {
                $request->admin_id = $adminId;
            }

            // 检查接口权限（如果不在免权限验证列表中）
            if (!in_array($request->action, $noNeedPermission)) {
                $hasPermission = $this->checkPermission($adminId, $request);
                if (!$hasPermission) {
                    return json(["code" => 403, "message" => "暂无访问权限"]);
                }
            }
        }

        // 不需要登录，请求继续向洋葱芯穿越
        return $handler($request);
    }

    /**
     * 检查用户是否有权限访问当前接口
     * @param int $adminId 用户ID
     * @param Request $request 请求对象
     * @return bool
     */
    private function checkPermission($adminId, Request $request): bool
    {
        // 获取用户信息
        $admin = AdminsModel::find($adminId);
        if (!$admin) {
            return false;
        }

        // 获取用户角色
        $role = RolesModel::find($admin->role_id);
        if (!$role) {
            return false;
        }

        // 如果是创建人角色，拥有所有权限
        if ($role->is_founder == 1) {
            return true;
        }

        // 构建当前请求的权限标识
        $controllerName = $this->getControllerName($request->controller);
        $actionName = $request->action;
        $permissionName = strtolower($controllerName) . '/' . $actionName;

        // 查询权限表中是否存在该权限
        $permission = PermissionModel::where('path', $permissionName)
            ->where('type', 2) // type=2表示接口权限
            ->first();

        if (!$permission) {
            // 如果权限表中没有定义该接口权限，拒绝访问
            return false;
        }

        // 检查角色是否拥有该权限
        $hasPermission = RolePermissionModel::where('role_id', $admin->role_id)
            ->where('menu_id', $permission->id)
            ->exists();

        return $hasPermission;
    }

    /**
     * 获取控制器名称（去除命名空间）
     * @param string $controllerClass 控制器类名
     * @return string
     */
    private function getControllerName($controllerClass): string
    {
        $className = class_basename($controllerClass);
        // 去除Controller后缀
        return str_replace('Controller', '', $className);
    }
}
